#pragma once
#include <vector>
#include <stack>
#include <algorithm>
#include <deque>


struct S
{
	int a;
	char b;
};
#define offsetof(type,m_name) ((size_t)(&(((struct S*)0)->m_name)))


std::vector<int> first_bigger_number(std::vector<int>& num)
{
	// 敲过无数遍的东西
	std::vector<int>res;
	std::stack<int>s;
	int n = num.size();

	// 倒序遍历
	for (int i = n - 1; i >= 0; i--)
	{
		// 弹出所有小于当前元素的栈顶元素
		while (!s.empty() && num[s.top()] <= num[i])
		{
			s.pop();
		}

		// 如果栈为空说明没有更大的元素
		if (s.empty())
		{
			res.push_back(n);
		}
		else
		{
			res.push_back(s.top());
		}

		// 用下标说话？？？高级
		s.push(i);
	} 

	// 返回结果矩阵
	// 先reverse一下
	std::reverse(res.begin(), res.end());
	return res;
}

//std::vector<int> sliding_window(std::vector<int>& num,int k)
//{
//	// 先来大家都会做的事情
//	int n = num.size();
//	std::vector<int>res;
//	std::queue<int>q;
//	res.clear();
//
//	if (k > n)
//	{
//		return res;
//	}
//	// 先往队列里push元素？？？那么是升序还是降序？？
//	for (int i = 0; i < k; i++)
//	{
//		// 判空必须单独，不然未定义行为
//		if (q.empty())
//		{
//			q.push(num[i]);
//		}
//		// 如果有更大的就push
//		if (q.back() < num[i])
//		{
//			q.push(num[i]);
//		}
//	}
//	// 当然是正序遍历
//	for (int i = k - 1; i < n; i++)
//	{
//		// 直接push，这是前面k个元素时的操作
//		res.push_back(q.back());
//
//		// 如果大于还是继续push
//		if (num[i] > q.back())
//		{
//			q.push()
//		}
//	}
//}

// 居然要用deque容器
std::vector<int>& sliding_window(std::vector<int>& v, int k)
{
	// 预处理
	int n = v.size();
	std::vector<int>res;
	if (n < k || n == 0||k==0)
	{
		return res;
	}
	if (k == 1)
	{
		delete& res;
		return v;
	}

	// 初始化（de)que(ue)容器。。。。。
	std::deque<int>dq;

	// 使用deque容器维护一个单调递减的双端
	for (int i = 0; i < n; i++)
	{
		// 我知道如何处理窗口后边的元素了
		// 处理那个超出窗口范围的5

	}
	// 最后返回结果容器
	return res;
}